package com.pro.util.imgBrowserUtil.util;

import io.minio.MinioClient;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.util.ArrayList;
import java.util.List;

/**
 * 对象存储服务 MinIo上传工具类
 *
 * @author kups
 * @since  2020-12-5
 */

public class MinioUtil {


    private static final String url = "http://121.36.30.36:9000";
    private static final String accessKey = "admin";
    private static final String secretKey = "j348admin";
    private static final String bucket="j345liulian"; //图片服务器的桶

    private static String browserImgUrl = url; //给图片地址设置初始


    /**
     * 选择具体存放位置：
     *  所属分类：商品、用户
     *  【注意】 桶是全局唯一的,若要存放到子文件夹则需要把路径加在文件名前。
     *  根据 i 变量判断是否需要添加到子文件夹
     * @param folder
     * @return
     */
    public static String type(String folder) {
        if ("course".equals(folder)) {
            return "course/";
        } else if ("audio_video".equals(folder)) {
            return "audio_video/";
        }else if("tuWenImg".equals(folder)){
            return "tuWenImg/";
        }else {
            return "";//存放到根目录，也就是桶 bucket
        }
    }

    /**
     * 上传单个图片
     * 不止于图片！
     * @return 图片对象
     */
    public static String uploadImage(String folder, MultipartFile multipartFile) {
        try {
            //isEmpty()方法检测字符串是否为空
            if (multipartFile.isEmpty()) return null;  //非空检测
            //file的最大size限定为10M=10*1024*1024(B)=10485760 bytes0
            //如果文件大于10MB则判断文件为null，也就是不能上传
            if (multipartFile.getSize() / 1024 / 1024 > 10) return null;  //图片大小检测 10MB

            //创建图片唯一id。通过RandomUtils封装类生成唯一图片id，方便后期项目访问地址
            String imageId = RandomUtils.getrandomImageId();

            //传输对象，访问服务器地址
            MinioClient minioClient = new MinioClient(url, accessKey, secretKey);

            //图片类型(注意：图片类型与后缀不是一回事,如 jpg格式为：img/jpeg)
            String contentType = multipartFile.getContentType();

            //原图片名称，
            String oldName =multipartFile.getOriginalFilename();


           //截取图片后缀
            //abc.jsp 从.加1开始截取
            //subString("字符串",字符串最后一次出现.的位置下标加一)
            String suffix= StringUtils.substring(oldName, oldName.lastIndexOf(".") + 1);

            //拼接图片url地址
            browserImgUrl = url + "/"+bucket+"/"+type(folder)+imageId+"."+suffix ;
            System.out.println(browserImgUrl);

            //把文件放置MinIo中：桶(文件夹)、文件名、文件流、类型
            //bucket 根目录 type(i) 子目录 imageId 图片id . suffix 图片后缀
            //根目录/子目录/图片id.图片后缀
            minioClient.putObject(bucket, type(folder)+imageId +"."+ suffix, multipartFile.getInputStream(), contentType);

            //创建图片操作对象,用于插入数据库： 图片id,原文件名,现图片名称,商品id,图片路径,用途,图片类型,图片大小,状态,图片url,图片类型,状态,排序,创建时间,更新时间,逻辑删除,
            //注释掉了创建时间，由于DataUtils不能使用，如果自己业务需要添加图片创建时间列，自行封装Date时间类
            //goodsPicture = new GoodsPicture(imageId, oldName,imageId +"."+ suffix, null, bucket+"/"+type(i)+imageId+"."+suffix, suffix, (int) multipartFile.getSize(), null, 0, -1, null, 0);

        } catch (Exception e) {
            return null;
        }
        return browserImgUrl;
    }

    /**
     * 批量上传
     *
     * @return 图片对象
     */
    public static List<String> uploadImage(String folder, List<MultipartFile> multipartFileList) {
        List<String> imgUrl = new ArrayList<>();
        for (MultipartFile multipartFile : multipartFileList) {
            imgUrl.add(uploadImage(folder, multipartFile));
        }
        return imgUrl;
    }

    /**
     * 删除图片
     */
    public static Boolean delImage(String folder, String name) {
        try {
            //获取对minio操作对象
            MinioClient minioClient = new MinioClient(url, accessKey, secretKey);
            System.out.println(type(folder)+name);
            //进行删除操作
            //objectName:为相对地址加后缀
            minioClient.removeObject(bucket, type(folder)+name);
        } catch (Exception e) {
            return false;
        }
        return true;
    }

    /**
     * 批量删除根据自己业务实现
     */
}
